/*******************************************************************************
 * Copyright (c) 2018, 2018 Grimm
 ******************************************************************************/
package com.alex.java8_02;

import java.util.Comparator;
import java.util.function.Consumer;

import org.junit.Test;

/**
 * @Author alex
 * @Created Feb 2, 2021 10:19:31 PM
 * @Description
 *              <p>
 *              一.Lambda表达式的基础语法：Java8中引入了一个新的操作符 “->” ,称为箭头操作符或者Lambda操作符
 *              Lambda操作符将 Lambda表达式拆分为左、右两部分
 *              左侧：表达式的参数列表
 *              右侧：表达式所执行的功能，即Lambda体
 *              语法格式一：无参数，无返回值
 *              () -> System.out.println("Hello Lambda");
 *              语法格式二：有一个参数，无返回值
 *              (x) -> System.out.println(x + 20);
 *              语法格式三：若只有一个参数,小括号可以省略不写
 *              x -> System.out.println(x + 20);
 *              语法格式四：有两个或者更多参数，有返回值，并且Lambda体有多条语句
 *              Comparator<Integer> com = (x, y) -> {
 *              System.out.println("函数式接口");
 *              return Integer.compare(x, y);
 *              };
 *              语法格式五：若Lambda体中只有一条语句，则大括号和"return"可以省略不写
 *              语法格式六：参数列表中的数据类型可以省略不写，因为JVM编译器可以通过上下文推断出数据类型，即“类型推断”
 *              上联：左右遇一括号省
 *              下联：左侧推断类型省
 *              横批：能省则省
 *              二.Lambda表达式需要“函数式接口”的支持，即只有一个方法的接口
 *              函数式接口可以使用 @FunctionalInterface 来标记
 */
public class TestLambda2 {

	// 对应语法格式一
	@Test
	public void test1() {
		Runnable run = new Runnable() {

			@Override
			public void run() {
				System.out.println("Hello World");
			}
		};
		run.run();
		System.out.println("--------------------------");
		Runnable r = () -> System.out.println("Hello Lambda");
		r.run();
	}

	@Test
	public void test2() {
		// 对应语法格式二
		Consumer<Integer> consumer1 = (x) -> System.out.println(x + 20);
		consumer1.accept(3);

		// 对应语法格式三
		Consumer<Integer> consumer2 = x -> System.out.println(x * 20);
		consumer2.accept(3);
	}

	@Test
	public void test3() {
		// 对应语法格式四
		Comparator<Integer> com1 = (x, y) -> {
			System.out.println("����ʽ�ӿ�");
			return Integer.compare(x, y);
		};

		// 对应语法格式五
		Comparator<Integer> com2 = (x, y) -> Integer.compare(x, y);
	}

	// 需求：对一个数进行运算
	@Test
	public void test4() {
		Integer a = method(100, x -> x * x);
		System.out.println(a);

	}

	private Integer method(Integer x, MyFunction my) {
		return my.getValue(x);
	}
}
